Kinetis SDK Demo Applications User Guide  1.0.0-beta
Freescale Semiconductor, Inc.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
low_power_demo.c File Reference
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include "device/fsl_device_registers.h"
#include "uart/fsl_uart_driver.h"
#include "fsl_uart_hal.h"
#include "smc/fsl_smc_manager.h"
#include "fsl_smc_features.h"
#include "fsl_smc_hal.h"
#include "gpio/fsl_gpio_driver.h"
#include "interrupt/fsl_interrupt_manager.h"
#include "clock/fsl_clock_manager.h"
#include "fsl_port_hal.h"
#include "fsl_sim_hal.h"
#include "fsl_mcg_hal.h"
#include "fsl_osc_hal.h"
#include "board.h"
#include "low_power_demo.h"
#include "fsl_pmc_hal.h"

Functions

void llwu_isr (void)
 LLWU ISR function. More...
 
void cpu_identify (void)
 cpu identification function for K22F120M More...
 
void de_init_pins (void)
 
void main (void)
 main function. More...
 
void port_init (void)
 configure tower/freedom hardware port pins for the application More...
 
void led_init (void)
 configure LED pins for the tower/freedom hardware More...
 
int32_t fll_freq (int32_t fllRef)
 returns the Frequency Locked Loop frequency More...
 
uint8_t what_mcg_mode (void)
 returns the the current MCG mode More...
 
int32_t pee_to_blpe (void)
 switch from PEE mode to BLPE mode More...
 
int32_t blpe_to_pee (void)
 switch from BLPE mode to PEE mode More...
 
void set_for_lp (uint8_t outOfLp)
 Settings done before swithing in low power mode. More...
 
void enter_vlls0 (uint8_t PORPOValue)
 VLLS0 mode entry routine. Puts the processor into VLLS0 mode from normal run mode or VLPR. More...
 
void enter_vlls1 (void)
 VLLS1 mode entry routine. Puts the processor into VLLS1 mode from normal run mode or VLPR. More...
 
void enter_vlls2 (void)
 VLLS2 mode entry routine. Puts the processor into VLLS2 mode from normal run mode or VLPR. More...
 
void enter_vlps (void)
 enter in VLPS mode More...
 
void enter_vlls3 (void)
 enter in VLLS3 mode More...
 
void enter_lls (void)
 LLS mode entry routine. Puts the processor into LLS mode from normal run mode or VLPR. More...
 
void exit_vlpr (void)
 VLPR mode exit routine. Puts the processor into normal run mode from VLPR mode. You can transition from VLPR to normal run using this function. More...
 
int32_t enter_vlpr (void)
 VLPR mode entry routine.Puts the processor into very low power run mode. In this mode all clocks are enabled, but the core clock limited. The flash clock is limited to 1MHz or less. More...
 
void enter_wait (power_modes_t pMode)
 WAIT mode entry routine. Puts the processor into wait mode. In this mode the core clock is disabled (no code executing), but bus clocks are enabled (peripheral modules are operational). More...
 
void enter_stop (smc_stop_submode_t partialStopOpt)
 STOP mode entry routine. Puts the processor into normal stop mode. In this mode core, bus and peripheral clocks are disabled. More...
 
void vlp_clock_config (int8_t nextMode)
 clock configuration for very low power More...
 
void demo_lptmr_isr (void)
 ISR Routine for Low Power Timer. More...
 
void lptmr_init (uint32_t count, uint32_t clockSource)
 Low Power Timer initialization routine. More...
 
void llwu_init (void)
 initializes LLWU module More...
 
void low_power_modes_test (void)
 main low power mode test routine More...
 
int32_t pee_pbe (int32_t crystalVal)
 switches from PEE to PBE mode More...
 
int32_t pbe_pee (int32_t crystalVal)
 switches from PBE to PEE mode More...
 
int32_t pbe_fbe (int32_t crystalVal)
 switches from PBE to FBE mode More...
 
int32_t fbe_pbe (int32_t crystalVal, int8_t prDivVal, int8_t vDivVal)
 switches from FBE to PBE mode This function transitions the MCG from FBE mode to PBE mode. This function presently only supports OSC0 and PLL0. Support for OSC1 and PLL1 will be added soon The function requires the desired OSC and PLL be passed in to it for compatibility with the future support of OSC/PLL selection More...
 
int32_t pbe_blpe (int32_t crystalVal)
 switches from PBE to BLPE mode More...
 
int32_t blpe_pbe (int32_t crystalVal, int8_t prDivVal, int8_t vDivVal)
 switches from BLPE to PBE mode Since PBE mode can be enterred via FBE -> BLPE modes, it cannot be assumed that the PLL has been previously configured correctly. That is why this general purpose driver has the PLL settings as passed parameters. More...
 
int32_t blpe_fbe (int32_t crystalVal)
 switches from BLPE to FBE mode More...
 
int32_t fbe_blpe (int32_t crystalVal)
 switches from FBE to PLPE mode More...
 
int32_t fei_fbe (int32_t crystalVal, mcg_hgo_select_t hgoVal, mcg_eref_clock_select_t erefsVal)
 switches from FEI to FBE mode More...
 
int32_t fee_fbe (int32_t crystalVal)
 switches from FEE to FBE mode More...
 
int32_t fbe_fbi (int32_t ircFreq, uint8_t ircSelect)
 switches from FBE to PLPE mode More...
 
int32_t fbi_fbe (int32_t crystalVal, mcg_hgo_select_t hgoVal, mcg_eref_clock_select_t erefsVal)
 switches from FBI to FBE mode More...
 
int32_t fbi_blpi (int32_t ircFreq, uint8_t ircSelect)
 switches from FBI to BLPI mode This function transitions the MCG from FBI mode to BLPI mode. This is achieved by setting the MCG_C2[LP] bit. There is no status bit to check so 0 is always returned if the function was called with the MCG in FBI mode. More...
 
int32_t blpi_fbi (int32_t ircFreq, uint8_t ircSelect)
 switches from BLPI to FBI mode More...
 
int32_t fee_fbi (int32_t ircFreq, uint8_t ircSelect)
 switches from FEE to FBI mode More...
 
int32_t fbi_fei (int32_t slowIrcFreqInner)
 switches from FBI to FEI mode More...
 
int32_t fei_fbi (int32_t ircFreq, uint8_t ircSelect)
 switches from FEI to FBI mode More...
 
int32_t fei_fee (int32_t crystalVal, mcg_hgo_select_t hgoVal, mcg_eref_clock_select_t erefsVal)
 switches from FEI to FEE mode More...
 
int32_t fee_fei (int32_t slowIrcFreqInner)
 switches from More...
 
uint8_t atc (uint8_t ircSelect, int32_t ircFreq, int32_t mcgOutFreq)
 configure for MCG auto trimming More...
 
int32_t pll_init (int32_t crystalVal, mcg_hgo_select_t hgoVal, mcg_eref_clock_select_t erefsVal, int8_t prDivVal, int8_t vDivVal, uint8_t mcgOutSelect)
 Option to move from FEI to PEE mode or to just initialize the PLL. More...
 
void out_srs (void)
 checks the value in the SRS registers and sends messages to the terminal announcing the status at the start of the code. More...
 
void port_isr (void)
 Port ISR routine for the on board switch. More...
 
void HardFault_Handler (void)
 

Variables

uint8_t s_uartInstance
 
uint8_t uartEnabled
 
static uart_state_t uartState
 
static uart_user_config_t uartConfig
 
int32_t fastIrcFreq
 
int32_t slowIrcFreq
 
int32_t mcgClkHz
 
int32_t mcgClkKhz
 
int32_t coreClkKhz
 
int32_t periphClkKhz
 
int32_t pllClkKhz
 
int32_t uart0ClkKhz
 
uint32_t uart0ClkHz
 
uint32_t uartClkHz
 

Function Documentation

uint8_t atc ( uint8_t  ircSelect,
int32_t  ircFreq,
int32_t  mcgOutFreq 
)
Parameters
ircSelect- 0 if slow irc, 1 if fast irc
ircFreq- IRC frequency
mcgOutFreq- MCG output frequency
int32_t blpe_fbe ( int32_t  crystalVal)
Parameters
crystalVal- external clock frequency in Hz
int32_t blpe_pbe ( int32_t  crystalVal,
int8_t  prDivVal,
int8_t  vDivVal 
)
Parameters
crystalVal- external clock frequency in Hz
prDivVal- value to divide the external clock source by to create the desired PLL reference clock frequency
vDivVal- value to multiply the PLL reference clock frequency by Return value : MCGCLKOUT frequency (Hz) or error code
int32_t blpe_to_pee ( void  )
int32_t blpi_fbi ( int32_t  ircFreq,
uint8_t  ircSelect 
)

This function transitions the MCG from BLPI mode to FBI mode. This is achieved by clearing the MCG_C2[LP] bit. There is no status bit to check so 0 is always returned if the function was called with the MCG in BLPI mode.

Parameters
ircFreq- IRC clock frequency
ircSelect- 0 if slow irc, 1 if fast irc Return value : MCGOUT frequency or error code
void cpu_identify ( void  )

cpu identification function for K22F120M

void de_init_pins ( void  )
void demo_lptmr_isr ( void  )
void enter_lls ( void  )

Mode transitions: RUN -> LLS VLPR -> LLS

NOTE: LLS mode will always exit to RUN mode even if you were in VLPR mode before entering LLS.

Wakeup from LLS mode is controlled by the LLWU module. Most modules cannot issue a wakeup interrupt in LLS mode, so make sure to setup the desired wakeup sources in the LLWU before calling this function.

void enter_stop ( smc_stop_submode_t  partialStopOpt)

Mode transitions: RUN -> STOP

This function can be used to enter normal stop mode. If you are executing in normal run mode when calling this function and AVLP = 0, then you will enter normal stop mode. If AVLP = 1 with previous write to PMPROT then you will enter VLPS mode instead.

STOP mode is exited using any enabled interrupt or RESET, so no exit_stop routine is needed.

Parameters
partialStopOpt- Partial Stop Option: 0x00 = STOP - Normal Stop Mode 0x40 = PSTOP1 - Partial Stop with both system and bus clocks disabled 0x80 = PSTOP2 - Partial Stop with system clock disabled and bus clock enabled 0xC0 = Reserved
void enter_vlls0 ( uint8_t  PORPOValue)

Mode transitions:

 RUN -> VLLS0, VLPR -> VLLS0

NOTE: VLLSx modes will always exit to RUN mode even if you were in VLPR mode before entering VLLSx.

Wakeup from VLLSx mode is controlled by the LLWU module. Most modules cannot issue a wakeup interrupt in VLLSx mode, so make sure to setup the desired wakeup sources in the LLWU before calling this function.

Parameters
PORPOValue- POR detect circuit is enabled/disabled
  • 0 POR detect circuit is enabled in VLLS0
  • 1 POR detect circuit is disabled in VLLS0
void enter_vlls1 ( void  )

Mode transitions: RUN -> VLLS1 VLPR -> VLLS1

NOTE: VLLSx modes will always exit to RUN mode even if you were in VLPR mode before entering VLLSx.

Wakeup from VLLSx mode is controlled by the LLWU module. Most modules cannot issue a wakeup interrupt in VLLSx mode, so make sure to setup the desired wakeup sources in the LLWU before calling this function.

void enter_vlls2 ( void  )

Mode transitions: RUN -> VLLS2 VLPR -> VLLS2

NOTE: VLLSx modes will always exit to RUN mode even if you were in VLPR mode before entering VLLSx.

Wakeup from VLLSx mode is controlled by the LLWU module. Most modules cannot issue a wakeup interrupt in VLLSx mode, so make sure to setup the desired wakeup sources in the LLWU before calling this function.

void enter_vlls3 ( void  )
int32_t enter_vlpr ( void  )

Mode transitions: RUN -> VLPR

exit_vlpr() function can be used to switch from VLPR back to RUN.

while in VLPR,VLPW or VLPS the exit to VLPR is not possible

Returns
PMSTAT - value or error code
           PMSTAT =  000_0001 Current power mode is RUN
                  =  000_0100 Current power mode is VLPR

           ERROR Code =  0x14 - already in VLPR mode
                      =  0x24 - REGONS never clear indicating stop regulation
void enter_vlps ( void  )
void enter_wait ( power_modes_t  pMode)

Mode transitions: RUN -> WAIT VLPR -> VLPW

This function can be used to enter normal wait mode or VLPW mode. If you are executing in normal run mode when calling this function, then you will enter normal wait mode. If you are in VLPR mode when calling this function, then you will enter VLPW mode instead.

NOTE: Some modules include a programmable option to disable them in wait mode. If those modules are programmed to disable in wait mode, they will not be able to generate interrupts to wake up the core.

WAIT mode is exited using any enabled interrupt or RESET, so no exit_wait routine is needed.

Parameters
pMode- specify the specific wait modes
         = kPowerModeVlpw to enter in VLPW mode
         = kPowerModeWait to enter in WAIT mode
void exit_vlpr ( void  )

Mode transitions: VLPR -> RUN

int32_t fbe_blpe ( int32_t  crystalVal)
Parameters
crystalVal- external clock frequency in Hz
int32_t fbe_fbi ( int32_t  ircFreq,
uint8_t  ircSelect 
)
Parameters
ircFreq- IRC clock frequency
ircSelect- 0 if slow irc, 1 if fast irc
int32_t fbe_pbe ( int32_t  crystalVal,
int8_t  prDivVal,
int8_t  vDivVal 
)
Parameters
crystalVal- external clock frequency in Hz
prDivVal- value to divide the external clock source by to create the desired PLL reference clock frequency
vDivVal- value to multiply the PLL reference clock frequency by Return value : MCGCLKOUT frequency (Hz) or error code
int32_t fbi_blpi ( int32_t  ircFreq,
uint8_t  ircSelect 
)
Parameters
ircFreq- IRC clock frequency
ircSelect- 0 if slow irc, 1 if fast irc Return value : MCGOUT frequency or error code
int32_t fbi_fbe ( int32_t  crystalVal,
mcg_hgo_select_t  hgoVal,
mcg_eref_clock_select_t  erefsVal 
)
Parameters
crystalVal- external clock frequency in Hz
hgoVal- selects whether low power or high gain mode is selected for the crystal oscillator. This has no meaning if an external clock is used.
erefsVal- selects external clock (=kMcgErefClockSelectExt) or crystal osc (=kMcgErefClockSelectOsc) Return value : MCGCLKOUT frequency (Hz) or error code
int32_t fbi_fei ( int32_t  slowIrcFreqInner)
Parameters
slowIrcFreqInner- slow IRD frequency
int32_t fee_fbe ( int32_t  crystalVal)
Parameters
crystalVal- external clock frequency in Hz
int32_t fee_fbi ( int32_t  ircFreq,
uint8_t  ircSelect 
)
Parameters
ircFreq- IRC clock frequency
ircSelect- 0 if slow irc, 1 if fast irc Return value : MCGOUT frequency or error code
int32_t fee_fei ( int32_t  slowIrcFreqInner)
Parameters
slowIrcFreqInner- slow IRC frequency
int32_t fei_fbe ( int32_t  crystalVal,
mcg_hgo_select_t  hgoVal,
mcg_eref_clock_select_t  erefsVal 
)

Mode transition: FEI to FBE mode

This function transitions the MCG from FEI mode to FBE mode. This is achieved by setting the MCG_C2[LP] bit. There is no status bit to check so 0 is always returned if the function was called with the MCG in FBI mode. The MCGCLKOUT frequency does not change

Parameters
crystalVal- external clock frequency in Hz
hgoVal- selects whether low power or high gain mode is selected for the crystal oscillator. This has no meaning if an external clock is used.
erefsVal- selects external clock (=kMcgErefClockSelectExt) or crystal osc (=kMcgErefClockSelectOsc) Return value : MCGCLKOUT frequency (Hz) or error code
int32_t fei_fbi ( int32_t  ircFreq,
uint8_t  ircSelect 
)
Parameters
ircFreq- IRC clock frequency
ircSelect- 0 if slow irc, 1 if fast irc
int32_t fei_fee ( int32_t  crystalVal,
mcg_hgo_select_t  hgoVal,
mcg_eref_clock_select_t  erefsVal 
)

This function transitions the MCG from FEI mode to FEE mode. This is achieved by setting the MCG_C2[LP] bit. There is no status bit to check so 0 is always returned if the function was called with the MCG in FBI mode. The MCGCLKOUT frequency does not change

Parameters
crystalVal- external clock frequency in Hz
hgoVal- selects whether low power or high gain mode is selected for the crystal oscillator. This has no meaning if an external clock is used.
erefsVal- selects external clock (=kMcgErefClockSelectExt) or crystal osc (=kMcgErefClockSelectOsc) Return value : MCGCLKOUT frequency (Hz) or error code
int32_t fll_freq ( int32_t  fllRef)
Parameters
fllRef- reference FLL frequency
void HardFault_Handler ( void  )
void led_init ( void  )
void llwu_init ( void  )
void llwu_isr ( void  )
void low_power_modes_test ( void  )
void lptmr_init ( uint32_t  count,
uint32_t  clockSource 
)
Parameters
count- initialize timer for 'count' miliseconds
clockSource- clock source
void main ( void  )
void out_srs ( void  )
int32_t pbe_blpe ( int32_t  crystalVal)
Parameters
crystalVal- crystal value
int32_t pbe_fbe ( int32_t  crystalVal)
Parameters
crystalVal- crystal value
int32_t pbe_pee ( int32_t  crystalVal)
Parameters
crystalVal- crystal value
int32_t pee_pbe ( int32_t  crystalVal)
Parameters
crystalVal- crystal value
int32_t pee_to_blpe ( void  )
int32_t pll_init ( int32_t  crystalVal,
mcg_hgo_select_t  hgoVal,
mcg_eref_clock_select_t  erefsVal,
int8_t  prDivVal,
int8_t  vDivVal,
uint8_t  mcgOutSelect 
)
Parameters
crystalVal- external clock frequency in Hz either from a crystal or square wave clock source
hgoVal- selects whether low power or high gain mode is selected for the crystal oscillator. This has no meaning if an external clock is used.
erefsVal- selects external clock (=0) or crystal osc (=1)
prdivVal- value to divide the external clock source by to create the desired PLL reference clock frequency
vdivVal- value to multiply the PLL reference clock frequency by
mcgOutSelect- 0 if the PLL is just to be enabled, non-zero if the PLL is used to provide the MCGOUT clock for the system.

Return value : PLL frequency (Hz) or error code

void port_init ( void  )
void port_isr ( void  )
void set_for_lp ( uint8_t  outOfLp)
Parameters
outOfLp- indicate whether to do the setting for going in/coming out of low power mode
         = 0 for going into low power mode
         = 1 for exiting low power mode
void vlp_clock_config ( int8_t  nextMode)
Parameters
nextMode= BLPI or BLPE
uint8_t what_mcg_mode ( void  )

Variable Documentation

int32_t coreClkKhz

Core clock frequency in KHz

int32_t fastIrcFreq

default fast irc frequency

int32_t mcgClkHz

MCG out clock frequecy in Hz

int32_t mcgClkKhz

MCG out clock frequency in KHz

int32_t periphClkKhz

Peripheral clock frequency in KHz

int32_t pllClkKhz

PLL clock frequency in KHz

uint8_t s_uartInstance

uart instance for the target

int32_t slowIrcFreq

default slow irc frequency

uint32_t uart0ClkHz

UART0 clock frequency in Hz

int32_t uart0ClkKhz

UART0 clock frequency in KHz

uint32_t uartClkHz

Other uart clock frequcy in Hz

uart_user_config_t uartConfig
static
uint8_t uartEnabled

indicates whether the uart port is currently enabled or not

uart_state_t uartState
static

uart state information